package com.soft.springhrms.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;

public class JwtUtil {
    // 密钥，用于加密和解密 JWT Token
    private static final String SECRET_KEY = "secretKey";  // 请替换为更复杂的密钥

    // 生成 JWT Token
    public static String generateToken(String username, Integer userId, Integer roleId) {
        return JWT.create()
                .withClaim("username", username)
                .withClaim("userId", userId)
                .withClaim("roleId", roleId)
                .withIssuedAt(new Date())
                .withExpiresAt(new Date(System.currentTimeMillis() + 3600000))  // 1小时过期
                .sign(Algorithm.HMAC256(SECRET_KEY));
    }

    // 验证 JWT Token
    public static boolean verifyToken(String token) {
        try {
            JWT.require(Algorithm.HMAC256(SECRET_KEY))
                    .build()
                    .verify(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    // 解析 JWT Token
    public static DecodedJWT parseToken(String token) {
        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
        return JWT.require(algorithm)
                .build()
                .verify(token);  // 校验 JWT Token
    }

    // 验证 Token 是否有效
    public static boolean isTokenValid(String token) {
        try {
            DecodedJWT decodedJWT = parseToken(token);
            Date expiration = decodedJWT.getExpiresAt();  // 获取 Token 的过期时间
            return expiration.after(new Date());  // 如果过期时间大于当前时间，则有效
        } catch (Exception e) {
            return false;  // 如果解析失败，则认为 Token 无效
        }
    }

    // 从 Token 中获取用户信息
    public static String getUsername(String token) {
        return JWT.decode(token).getClaim("username").asString();
    }

    public static Integer getUserId(String token) {
        return JWT.decode(token).getClaim("userId").asInt();
    }

    public static Integer getRoleId(String token) {
        return JWT.decode(token).getClaim("roleId").asInt();
    }
}
